home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Amiga Public Domain Connection
/
APDC Disk #005 - Amiga Basic Programs (198x)(Amiga Public Domain Connection)(US)[WB].zip
/
APDC Disk #005 - Amiga Basic Programs (198x)(Amiga Public Domain Connection)(US)[WB].adf
/
LunarLander
< prev
next >
Wrap
Text File
|
1988-03-13
|
15KB
|
457 lines
mode%=1 'mode%=1 production, mode%=0 for debug
'Lunar Lander Game Program
'By: Brian Allston 3/20/86
'
start:
PRINT "Lunar Lander Game"
PRINT "Amiga BASIC version by:"
PRINT "Brian Allston 3/20/86"
PRINT " "
PRINT " "
PRINT " "
PRINT " Attach amplifier and speakers for voice"
DIM moonscape.h%(641)
SAY(TRANSLATE$(""))
RANDOMIZE TIMER
GOSUB initscreen
WIDTH 80
CLS
FOR i=1 TO 20
LOCATE i,i*2+10:PRINT"Lunar Lander"
NEXT i
IF mode%=0 THEN mode%=5
MENU mode%,0,1,"Options"
MENU mode%,1,1,"Start Mission"
MENU mode%,2,1,"Quit "
MENU mode%,3,1,"Help "
IF mode%<>1 THEN GOTO dmsave
MENU 2,0,0,"" 'disable default menus
MENU 3,0,0,""
MENU 4,0,0,""
dmsave:
RESTORE moonscape
FOR i=1 TO 640
READ moonscape.h%(i) 'Input horizon definition
NEXT i
CLS
speech$="Welcome to Lunar Lander."
LOCATE 6,40-CINT(LEN(speech$)/2):PRINT speech$
SAY TRANSLATE$(speech$)
speech$="The object of your mission is to make a perfect landing on your base."
LOCATE 12,40-CINT(LEN(speech$)/2):PRINT speech$
SAY TRANSLATE$(speech$)
RESTORE lander
ship$=""
FOR i=1 TO 62
READ ship.data%
ship$=ship$+CHR$(ship.data%)
NEXT i
speech$="Land quickly, softly, and use as little fuel as possible."
LOCATE 18,40-CINT(LEN(speech$)/2):PRINT speech$
SAY TRANSLATE$(speech$)
speech$="Use Options Menu to start mission."
COLOR 1,2:LOCATE 22,40-CINT(LEN(speech$)/2):PRINT speech$;:COLOR 1,0
SAY TRANSLATE$(speech$)
menucheck:
MENU ON
ON MENU GOSUB getoption
SLEEP
GOTO menucheck
getoption:
OBJECT.OFF
IF MENU(0) <> mode% THEN GOTO nomenu
moption%=MENU(1)
MENU OFF
IF moption%=0 THEN GOTO getoption
ON MENU GOSUB 0
ON moption%+1 GOTO nomenu,main,exit1,showhelp
nomenu:
RETURN
showhelp:
CLS
WINDOW 3,"Mission Objective",(20,20)-(600,130),0,1
WINDOW OUTPUT 3
LOCATE 1,1:COLOR 1,0
PRINT " Your mission is to pilot your landing craft to a 'soft' landing"
PRINT " on the lunar base. Use your thrusters (use the left mouse"
PRINT " button and cursor) on the control panel to accelerate the lander"
PRINT " in the desired direction. Your score is determined by combined"
PRINT " speed, landing distance from base, fuel used, elapsed time."
PRINT ""
PRINT " Hint: You always accelerate downward due to gravity and will "
PRINT " only drift horizontally. Also, the lander will 'wrap-around'"
PRINT " the side edges. So don't waste fuel on side thrust."
PRINT ""
PRINT " Good luck! Brian Allston (76515,1506)"
PRINT ""
COLOR 1,2:LOCATE 13,22:PRINT "Press left mouse button to continue.";:COLOR 1,0
keepopen:
IF MOUSE(0)=0 THEN GOTO keepopen
WINDOW OUTPUT 2
WINDOW CLOSE 3
RETURN
main:
GOSUB drawscreen
GOSUB initlander
GOSUB updatedisplay
ON TIMER(.25) GOSUB updatevalues:TIMER ON
'
'Loop until lander touches the horizon
WHILE y&<horizon%
x&=OBJECT.X(1)
IF x&<6 OR x&>620 THEN
IF edgecheck<6 THEN
border=-2
ELSE
border=-4
END IF
GOSUB edge
x&=OBJECT.X(1)
END IF
horizon%=moonscape.h%(x&)
y&=OBJECT.Y(1)+8
GOSUB updatedisplay
WEND
'
'
TIMER OFF
'Check for crash and compute score
OBJECT.STOP 1
computescore:
vterm=SQR(vx*vx+vy*vy)
xterm=ABS(basex-x&):IF xterm>305 THEN xterm=xterm-305
yterm=y-8
IF vterm>vcrash THEN
IF OBJECT.Y(1)>150 THEN OBJECT.Y 1,140
SOUND WAIT
SOUND 180,40,180,0
SOUND 220,40,180,1
SOUND 260,40,180,2
SOUND 300,40,180,3
SOUND RESUME
yterm=OBJECT.Y(1)+8
xterm=OBJECT.X(1)+5
LINE (xterm,yterm)-(xterm-50,yterm-45),3
LINE (xterm,yterm)-(xterm+50,yterm-50),6
LINE (xterm,yterm)-(xterm-25,yterm-10),6
LINE (xterm,yterm)-(xterm+50,yterm-35),7
LINE (xterm,yterm)-(xterm-10,yterm-60),7
LINE (xterm,yterm)-(xterm+60,yterm-10),3
LINE (xterm,yterm)-(xterm-40,yterm-5),3
LINE (xterm,yterm)-(xterm+20,yterm-30),6
score&=0
landing$="You crashed! There were no survivors."
landing1$="No."
GOTO displayscore2
END IF
landing$="You made a "
landing1$=landing$
IF vterm>vcrash/2 THEN
landing$=landing$+"hard "
landing1$=landing1$+"hard "
ELSEIF vterm>vcrash/4 THEN
landing$=landing$+"soft "
landing1$=landing1$+"soft "
ELSE
landing$=landing$+"perfect "
landing1$=landing1$+"perfect "
END IF
score1=score&
landing$=landing$+"landing, "
landing1$=landing1$+"landing, "
IF xterm>100 THEN
landing$=landing$+"far from the base."
landing1$=landing1$+"far from the base."
ELSEIF xterm>20 THEN
landing$=landing$+"near to the base."
landing1$=landing1$+"near to the base."
ELSE
landing$=landing$+"right on the base. Congratulations!"
landing1$=landing1$+"right on the base. Congratulations"
END IF
score1%=CINT(10*(1-vterm/vcrash))+1
score2%=CINT(15*(1-xterm/310))+1
score3%=CINT(5*fuel/ifuel)+1
score4%=CINT(5/etime)+1
score&=score1%*score2%*score3%*score4%
displayscore:
COLOR 1,0
LOCATE 8,40-CINT(LEN(landing$)/2):PRINT landing$
SAY TRANSLATE$(landing1$)
LOCATE 11,30:PRINT USING "Your score is: #####";score&
RETURN
displayscore2:
COLOR 1,0
LOCATE 8,40-CINT(LEN(landing$)/2):PRINT landing$
LOCATE 11,30:PRINT "Your score is 0."
RETURN
'
'Update lander velocity based upon "thrusters"
updatevalues:
etime=etime+(1/120)
vy=vy+gravity
IF fuel=0 THEN GOTO noaccel
mousestat%=MOUSE(0)
mx=MOUSE(1):my=MOUSE(2)
IF mousestat%=0 THEN
IF oldthrust%<>0 THEN GOSUB clearthrust
GOTO noaccel
END IF
mousecheck:
IF mx>=296 AND mx<=325 THEN
IF my>=157 AND my<=170 THEN thrust%=1:vy=vy-2
IF my>=173 AND my<=186 THEN thrust%=2:vy=vy+2
ELSEIF my>=164 AND my<=177 THEN
IF mx>=260 AND mx<=290 THEN thrust%=3:vx=vx-6
IF mx>=331 AND mx<=361 THEN thrust%=4:vx=vx+6
END IF
IF oldthrust%<>thrust% THEN GOSUB clearthrust
IF thrust%=0 THEN GOTO noaccel
showthrust:
COLOR 1,6
IF thrust%=1 THEN LINE (297,158)-(324,169),6,bf:LOCATE 21,39:PRINT "UP";
IF thrust%=2 THEN LINE (297,174)-(324,185),6,bf:LOCATE 23,39:PRINT "DN";
IF thrust%=3 THEN LINE (261,165)-(289,176),6,bf:LOCATE 22,34:PRINT "<-";
IF thrust%=4 THEN LINE (332,165)-(360,176),6,bf:LOCATE 22,43:PRINT "->";
oldthrust%=thrust%
COLOR 1,0
updatefuel:
fuel=fuel-8.3
IF fuel<0 THEN fuel=0
GOTO noaccel
clearthrust:
IF oldthrust%=0 THEN RETURN
COLOR 1,0
IF oldthrust%=1 THEN LINE (297,158)-(324,169),0,bf:LOCATE 21,39:PRINT "UP";
IF oldthrust%=2 THEN LINE (297,174)-(324,185),0,bf:LOCATE 23,39:PRINT "DN";
IF oldthrust%=3 THEN LINE (261,165)-(289,176),0,bf:LOCATE 22,34:PRINT "<-";
IF oldthrust%=4 THEN LINE (332,165)-(360,176),0,bf:LOCATE 22,43:PRINT "->";
oldthrust%=thrust%
RETURN
noaccel:
OBJECT.VX 1,vx
OBJECT.VY 1,vy
OBJECT.START 1
thrust%=0:mousestat%=0
RETURN
'
'Let lander "wrap-around" the left and right borders
wraparound:
border=COLLISION(1)
edge:
IF border=-1 THEN OBJECT.Y 1,1:GOTO restart
IF border=-3 THEN OBJECT.STOP 1:RETURN
IF border=-2 THEN OBJECT.X 1,619:GOTO restart
IF border=-4 THEN OBJECT.X 1,6
restart:
OBJECT.START 1
RETURN
'
'Update Display Values
updatedisplay:
TIMER STOP
COLOR 1,2
LOCATE 21,3:PRINT USING " ####.#";vy*(-17.6);
LOCATE 23,3:PRINT USING " ####.#";vx*5.5;
LOCATE 21,69:PRINT USING " ####.#";(horizon%-y&)*17.6;
LOCATE 23,69:PRINT USING " ####.#";fuel;
COLOR 1,0
TIMER ON
RETURN
'
'Initialize lander position, velocity, and fuel terms
initlander:
gravity=.5
ifuel=400:fuel=ifuel
x&=CINT(RND*610)+5
y&=1
vx=12
IF RND<.5 THEN vx=vx*(-1)
vy=2
vcrash=20
OBJECT.SHAPE 1,ship$
OBJECT.X 1,x&
OBJECT.Y 1,y&
OBJECT.VX 1,vx
OBJECT.VY 1,vy
OBJECT.ON 1
OBJECT.START 1
ON COLLISION GOSUB wraparound
horizon%=moonscape.h%(x&)
COLLISION ON
RETURN
'
'Initialize window and game display
initscreen:
SCREEN 1,640,200,3,2 'Define window parameters
WINDOW 2,"Lunar Lander",,8,1
PALETTE 4,.8,.6,.53 'tan --
PALETTE 5,.33,.87,0 'green | _Additional
PALETTE 6,1,0,0 'red | Colors
PALETTE 7 ,1,1,.13 'yellow --
RETURN
'
drawscreen:
COLOR 1,3 'Draw flight display window
LINE (0,0)-(640,200),3,bf
LINE (5,0)-(625,150),2,bf
FOR i=1 TO 50 'Draw stars
x=INT(RND*620)+5
y=INT(RND*150)
PSET(x,y),1
NEXT i
CIRCLE (580,50),75,0 'draw ringed planet
LINE (5,0)-(625,150),0,b
CIRCLE (580,50),85,0,2.6,6,1/12
CIRCLE (580,50),110,0,2.25,6,1/12
CIRCLE (580,50),150,0,2.05,6,1/12
PAINT (494,50),7,0
PAINT (580,58),7,0
PAINT (465,50),6,0
PAINT (580,60),6,0
PAINT (580,50),0
PAINT (580,70),0
CIRCLE (580,50),85,2,2.65,6,1/12
CIRCLE (580,50),110,2,2.3,6,1/12
CIRCLE (580,50),150,2,2.08,6,1/12
'
LINE (625,0)-(640,150),3,bf 'draw horizon
LINE (625,150)-(5,150),4
LINE (5,150)-(5,126),4
LINE (5,126)-(25,138),4
LINE (25,138)-(60,138),4
LINE (60,138)-(70,144),4
LINE (70,144)-(80,144),4
LINE (80,144)-(120,120),4
LINE (120,120)-(140,100),4
LINE (140,100)-(360,130),4
LINE (360,130)-(500,130),4
LINE (500,130)-(550,145),4
LINE (550,145)-(625,136),4
LINE (625,136)-(625,150),4
PAINT (6,148),4 'paint moonscape
'CIRCLE (20,140),7,2,1/25
'CIRCLE (130,130),15,2,1/25
LINE (5,0)-(625,150),2,b 'cover planet edge
'
basex=CINT(RND*600)+5 'randomly position base
basey=moonscape.h%(basex)
LINE (basex,basey)-STEP(15,6),6,bf
LINE (basex+1,basey-20)-STEP(13,22),2,bf
'
COLOR 1,3: 'Draw Instrument Panel
LOCATE 20,3:PRINT "V-SPEED";
LOCATE 22,3:PRINT "H-SPEED";
LOCATE 20,69:PRINT "Altitude";
LOCATE 22,69:PRINT " Fuel ";
LINE (10,160)-(80,167),2,bf
LINE (10,176)-(80,184),2,bf
LINE (540,160)-(610,167),2,bf
LINE (540,176)-(610,184),2,bf
LINE (296,157)-(325,170),0,bf
LINE (296,173)-(325,186),0,bf
LINE (260,164)-(290,177),0,bf
LINE (331,164)-(361,177),0,bf
COLOR 1,0
LOCATE 21,39:PRINT "UP";
LOCATE 22,34:PRINT "<-";
LOCATE 22,43:PRINT "->";
LOCATE 23,39:PRINT "DN";
LINE (296,157)-(325,170),2,b
LINE (296,173)-(325,186),2,b
LINE (260,164)-(290,177),2,b
LINE (331,164)-(361,177),2,b
RETURN
'
'End of program clean-up
exit1:
TIMER OFF
COLLISION OFF
WINDOW CLOSE 1
MENU OFF
MENU RESET
OBJECT.OFF
SYSTEM
'
moonscape:
DATA 126, 126, 126, 126, 126, 127, 127, 128, 128, 129
DATA 130, 130, 131, 131, 132, 133, 133, 134, 134, 135
DATA 136, 136, 137, 137, 138, 138, 138, 138, 138, 138
DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
DATA 139, 139, 140, 140, 141, 142, 142, 143, 143, 144
DATA 144, 144, 144, 144, 144, 144, 144, 144, 144, 144
DATA 143, 143, 142, 142, 141, 140, 140, 139, 139, 138
DATA 137, 137, 136, 136, 135, 134, 134, 133, 133, 132
DATA 131, 131, 130, 130, 129, 128, 128, 127, 127, 126
DATA 125, 125, 124, 124, 123, 122, 122, 121, 121, 120
DATA 119, 118, 117, 116, 115, 114, 113, 112, 111, 110
DATA 109, 108, 107, 106, 105, 104, 103, 102, 101, 100
DATA 100, 100, 100, 101, 101, 101, 101, 101, 101, 101
DATA 102, 102, 102, 102, 102, 102, 102, 102, 103, 103
DATA 103, 103, 103, 103, 103, 104, 104, 104, 104, 104
DATA 104, 104, 105, 105, 105, 105, 105, 105, 105, 105
DATA 106, 106, 106, 106, 106, 106, 106, 107, 107, 107
DATA 107, 107, 107, 107, 108, 108, 108, 108, 108, 108
DATA 108, 108, 109, 109, 109, 109, 109, 109, 109, 110
DATA 110, 110, 110, 110, 110, 110, 111, 111, 111, 111
DATA 111, 111, 111, 111, 112, 112, 112, 112, 112, 112
DATA 112, 113, 113, 113, 113, 113, 113, 113, 114, 114
DATA 114, 114, 114, 114, 114, 114, 115, 115, 115, 115
DATA 115, 115, 115, 116, 116, 116, 116, 116, 116, 116
DATA 116, 117, 117, 117, 117, 117, 117, 117, 118, 118
DATA 118, 118, 118, 118, 118, 119, 119, 119, 119, 119
DATA 119, 119, 119, 120, 120, 120, 120, 120, 120, 120
DATA 121, 121, 121, 121, 121, 121, 121, 122, 122, 122
DATA 122, 122, 122, 122, 122, 123, 123, 123, 123, 123
DATA 123, 123, 124, 124, 124, 124, 124, 124, 124, 125
DATA 125, 125, 125, 125, 125, 125, 125, 126, 126, 126
DATA 126, 126, 126, 126, 127, 127, 127, 127, 127, 127
DATA 127, 128, 128, 128, 128, 128, 128, 128, 128, 129
DATA 129, 129, 129, 129, 129, 129, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
DATA 130, 131, 131, 131, 132, 132, 132, 132, 133, 133
DATA 133, 134, 134, 134, 134, 135, 135, 135, 136, 136
DATA 136, 137, 137, 137, 138, 138, 138, 138, 139, 139
DATA 139, 140, 140, 140, 140, 141, 141, 141, 142, 142
DATA 142, 143, 143, 143, 144, 144, 144, 144, 145, 145
DATA 145, 145, 144, 144, 144, 143, 143, 143, 143, 142
DATA 142, 142, 142, 141, 141, 141, 141, 140, 140, 140
DATA 140, 139, 139, 139, 139, 138, 138, 138, 138, 137
DATA 137, 137, 137, 136, 136, 136, 136, 135, 135, 135
DATA 135, 134, 134, 134, 134, 133, 133, 133, 133, 132
DATA 132, 132, 132, 131, 131, 131, 131, 130, 130, 130
DATA 130, 129, 129, 129, 129, 128, 128, 128, 128, 127
DATA 127, 127, 127, 126, 126, 126, 126, 126, 126, 126
DATA 126, 126, 126, 126, 126, 126, 126, 126, 126, 126
'
lander:
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 2, 0, 0, 0, 11, 0, 0, 0, 9
DATA 0, 24, 0, 3, 0, 0, 4, 0, 14, 0
DATA 10, 0, 10, 0, 10, 0, 31, 0, 31, 0
DATA 63, 128, 64, 64, 0, 0, 0, 0, 4, 0
DATA 4, 0, 4, 0, 14, 0, 14, 0, 0, 0
DATA 0, 0
'
END